home *** CD-ROM | disk | FTP | other *** search
-
- IFND MULU32_I
- MULU32_I=1
-
- ;----------------------------------------
- ; Multipliziert zwei 32-Bit Zahlen
- ; Übergabe : 1. Quelle 1
- ; 2. Ergebnis H
- ; 3. Quelle 2 = Ergebnis L
-
- mulu32 MACRO
-
- IFND CPU
- FAIL Symbol CPU must defined for macro "mulu32.i" (i.e. CPU=68020)
- ENDIF
- IFNE NARG-3
- IFNE NARG-2
- FAIL bad amount of args to macro "mulu32" (i.e. "Mulu32 d1,d2,d3" or "Mulu32 d1,d2")
- ENDC
- ENDC
-
- IFPL CPU-68020
- IFEQ NARG-2
- mulu.l \1,\2
- ELSE
- mulu.l \1,\2:\3
- ENDC
- ELSE
- IFEQ NARG-2
- ;\1 Quelle 1
- ;\2 Quelle 2
- ;\2 Ergebnis
- move.l \2,-(a7)
- mulu \1,\2 ;LOW1 * LOW2
- move.l \2,-(a7)
- swap \1
- move.w (6,a7),\2
- mulu \1,\2 ;HIGH1 * LOW2
- add.w \2,(a7)
- swap \1
- move.w (4,a7),\2
- mulu.w \1,\2 ;LOW1 * HIGH2
- swap \2
- add.l (a7)+,\2
- addq.l #4,a7 ;(OVERFLOW & CARRY are not set correctly !!!)
- ELSE
- ;\1 Quelle 1
- ;\3 Quelle 2
- ;\2 Ergebnis High
- ;\3 Ergebnis Low
- move.w \1,\2 ;1. MULU (beide Low-Teile)
- mulu.w \3,\2
- move.l \2,-(a7) ;-> ELH\@
-
- move.l \1,\2 ;2. MULU (beide High-Teile)
- swap \2
- swap \3 ;Q2 swapped
- mulu.w \3,\2
- move.l \2,-(a7) ;-> EHH\@
-
- move.w \1,\2 ;3. MULU (Low und High-Teil)
- mulu.w \3,\2
- add.l \2,(2,a7)
- bcc.b .skip1\@
- addq.w #1,(a7)
- .skip1\@
- move.l \1,\2 ;4. MULU (High und Low-Teil)
- swap \2
- swap \3
- mulu.w \3,\2
- add.l \2,(2,a7)
- bcc.b .skip2\@
- addq.w #1,(a7)
- .skip2\@
- move.l (a7)+,\2
- move.l (a7)+,\3
- ENDC
- ENDC
- ENDM
- ENDC
-
-